package ele.utils;


import app.nbdevices.utils.ConvertUtil;

/**
 * 电表命令生成器
 */

public class EleCmdGenerator {
         //读数据
        private static final byte ELE_READ_DATA=0x11;
        //读后续数据
        private static final byte ELE_READ_LAST_DATA=0x12;
        //广播校准时间
        private static final byte ELE_CHECK_TIME=0x08;
       /**
        * @Description: 初始化命令结构
        * @Param:
        * @Returns:byte[]
        * @Date: 2019/12/5
        */
    public static byte[] initCmd(String address,byte[] data,byte cmdCode){
        byte[] cmd=new byte[12+data.length];
        cmd[0]=0x68;
        byte[] addr=ConvertUtil.getBase64Codec().decode(address);
        for(int i=0;i<6;i++){
            cmd[i+1]=addr[i];
        }
        cmd[7]=0x68;
        cmd[8]=cmdCode;
        cmd[9]=(byte)data.length;
        for(int i=0;i<data.length;i++){
            cmd[i+10]=data[i];
        }
        cmd[data.length+10]= ConvertUtil.sumCheck(cmd,data.length+10);
        cmd[data.length+11]=0x16;
        return cmd;
    }
    /**
     * 生成读ICCD卡号命令
     */
    public static String readICCD(String addrid){
        byte[] addrId=ConvertUtil.getBase64Codec().decode(addrid);
        byte[] cmdData=new byte[16];
        cmdData[0]=0x68;
        //初始化地址码
        cmdData[1]=addrId[0];
        cmdData[2]=addrId[1];
        cmdData[3]=addrId[2];
        cmdData[4]=addrId[3];
        cmdData[5]=addrId[4];
        cmdData[6]=addrId[5];

        cmdData[7]=0x68;
        cmdData[8]=0x05;
        cmdData[9]=0x04;
        cmdData[10]=0x33-18;
        cmdData[11]=0x33;
        cmdData[12]=0x33;
        cmdData[13]=0x47;
        cmdData[14]=ConvertUtil.sumCheck(cmdData,15);
        cmdData[15]=0x16;
        System.out.println(ConvertUtil.sumCheck(cmdData,15));
        return ConvertUtil.getBase64Codec().encodeAsString(cmdData);
    }
        /**
         * @Description: 生成读数据命令
         * @Param: [addr地址域, data结构：数据标识4|数据标识4+负荷记录块数1|数据标识4+给定时间(分，时，年，月，日)5+负荷记录块数1]
         * @Returns: String
         */
    public static String readDataCmd(String addr,byte[] data){
            byte[] cmd=initCmd(addr,data,ELE_READ_DATA);
            return ConvertUtil.getBase64Codec().encodeToString(cmd);
    }
        /**
         * @Description: 生成读后续数据命令
         * @Param: 【addr地址域，data结构：数据标识4+帧序号1】
         * @Returns: String
         */
    public static String readLastDataCmd(String addr,byte[] data){
        byte[] cmd=initCmd(addr,data,ELE_READ_LAST_DATA);
        return ConvertUtil.getBase64Codec().encodeToString(cmd);
    }

        /**
         * @Description: 广播校时
         * @Param: 【time：秒分时日月年 6】
         * @Returns: String
         */
    public static String checkTime(byte[] time){
      //  byte[] addr={(byte)0x99,(byte)0x99,(byte)0x99,(byte)0x99,(byte)0x99,(byte)0x99};
        String addr="";
        byte[] cmd=initCmd(addr,time,ELE_CHECK_TIME);
        return ConvertUtil.getBase64Codec().encodeToString(cmd);
    }

    public static void main(String[] args) {
        //190810000081
//        byte[] bs = ConvertUtil.getBase64Codec().decode("gQAAEAgZ");
//        for(int i=0;i<bs.length;i++){
//            System.out.println(Integer.toHexString(bs[i]));
//        }
        String s = readICCD("JQEAEAgZ");
        System.out.println(s);
        //aCUBABAIGWgFBO4AABQyFg==
        //aCUBABAIGWgFBO4AABQyFg==
        //aCUBABAIGWjFATQhFg==
//        byte[] ds = ConvertUtil.getBase64Codec().decode("aCUBABAIGWjFATQhFg==");
//        byte[] dss = ConvertUtil.getBase64Codec().decode("aCUBABAIGWgFBCEzM0f+Fg==");
//        for(byte b:ds){
//            System.out.print(Integer.toHexString(Byte.toUnsignedInt(b))+" ");
//        }
//        System.out.println();
//        for(byte b:dss){
//            System.out.print(Integer.toHexString(Byte.toUnsignedInt(b))+" ");
//        }

//        byte[] adds={0x02,0x00,0x06,0x06,0x19,0x20};//aAIABgYZIGgRBDMzMzP4Fg==
//        String addr=ConvertUtil.getBase64Codec().encodeToString(adds);
//        byte[] data={0x33,0x33,0x33,0x33};
//        System.out.println(readDataCmd(addr,data));
      //System.out.println((byte)0xff);
    }

}
